// #pragma once

// #include "../comm/util.hpp"
// #include "../comm/log.hpp"

// #include <iostream>
// #include <string>
// #include <vector>
// #include <unordered_map>
// #include <fstream>
// #include <cstdlib>
// #include <cassert>

// //根据problems.list文件，加载所有的题目信息到内存中
// //model:主要用来和数据进行交互,对外提供访问数据的接口

// namespace ns_model
// {
//     using namespace std;
//     using namespace ns_log;
//     using namespace ns_util;

//     //定义题目相关属性
//     struct Problem
//     {
//         std::string id;//题目编号
//         std::string title;//题目名称
//         std::string star;//题目难度

//         int cpu_limit;//cpu时间限制
//         int mem_limit;//内存限制

//         std::string desc;//题目描述
//         std::string header;//题目接口
//         std::string tail;//题目测试用例和标准代码
//     };

//     const std::string problem_list ="./problems/problems.list";
//     const std::string problem_path = "./problems/";

//     //定义题目管理器类
//     class Model
//     {
//     private:
//         //存储题目的容器
//         std::unordered_map<std::string, Problem> problems;

//     public:
//         Model()
//         {
            
//             assert(LoadProblemList(problem_list));
//         }
//         ~Model(){}
    
//     public:
//         bool LoadProblemList(const std::string &problem_list)//加载题库
//         {
//             //加载配置文件：problems/problems.list+题目编号文件
//             ifstream in(problem_list);
//             if(!in.is_open())
//             {
//                 LOG(FATAL)<<"：加载题库失败，请检查是否存在题库文件\n";
//                 return false;
//             }

//             string line;
//             while(getline(in, line))
//             {
//                 vector<string> tokens;
//                 StringUtil::SplitString(line, &tokens, " ");
//                 //切割字符串，获取题属性字段
//                 // 1 两数之和 简单 1 262144
//                 if(tokens.size() != 5)
//                 {
//                     LOG(WARNING)<<"：加载题库失败，请检查题库文件格式\n";
//                     continue;
//                 }
//                 //获取题目的属性
//                 Problem problem;
//                 problem.id = tokens[0];
//                 problem.title = tokens[1];
//                 problem.star = tokens[2];
//                 problem.cpu_limit = atoi(tokens[3].c_str());//将字符串转换为整数
//                 problem.mem_limit = atoi(tokens[4].c_str());

//                 string path=problem_path;
//                 path += problem.id;
//                 path += "/";

//                 //在题号对应的路径下读取描述和代码文件：./problems/[题号]/
//                 //读取到的内容被填充到题目对象p 中（输出型参数）
//                 FileUtil::ReadFile(path + "desc.txt", &(problem.desc),true);
//                 FileUtil::ReadFile(path + "header.cpp", &(problem.header),true);
//                 FileUtil::ReadFile(path + "tail.cpp", &(problem.tail),true);

//                 //将题目的属性存储到容器中
//                 problems.insert(make_pair(problem.id, problem));

//             }
//             LOG(INFO)<<"：加载题库成功\n";
//             in.close();
//             return true;
//         }

//         //获取题目列表，out是输出型参数
//         bool GetAllProblems(std::vector<Problem> *out)
//         {
//             if(problems.size()==0)
//             {
//                 LOG(WARNING)<<"：题库为空\n";
//                 return false;
//             }
//             for(const auto &p : problems)
//             {
//                 out->push_back(p.second);
//             }

//             return true;
//         }

//         //获取题号id对应的题目，参数p是输出型参数
//         bool GetOneProblem(const std::string &id, Problem *p)
//         {
//             const auto &iter = problems.find(id);
//             if(iter == problems.end())
//             {
//                 LOG(ERROR)<<"：用户获取题目失败，题目编号:"<<id<<"\n";
//                 return false;
//             }
//             (*p) = iter->second;
//             cout<<"获取题目成功"<<endl;
//             return true;
//         }
//     };
// }

